package com.diamond.bo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;

import org.apache.log4j.Logger;

public class ExcelUtils3 implements Serializable {

	private static final long serialVersionUID = 1435960394440922012L;
	Logger  log = Logger.getLogger(ExcelUtils3.class);
	String MAKE_BY_NAME = "name";
	String MAKE_BY_INDEX = "index";

	
	/**将Excel转换为集合,方便Json的转换;*/
	public List<Map<String,String>> convertSheetToData(Sheet sheet,Class<? extends Serializable> Bean){
		List<Map<String,String>> dataList=new ArrayList<Map<String,String>>();
		for (int r = 0; r < sheet.getRows(); r++) {
			Cell[] row=sheet.getRow(r);
			Map<String,String> dataMap=new HashMap<String,String>();
			for(int c=0;c<row.length;c++){
				Cell cell=row[c];
				if(cell.getType()==CellType.DATE){
					Date date=((DateCell)cell).getDate();
					dataMap.put(String.valueOf(c), date.toString());
				}else{
					dataMap.put(String.valueOf(c), cell.getContents());
				}
			}
			dataList.add(dataMap);
		}
		return dataList;
	}
	
	/**
	 * 从Excel文件中的Sheet中读取信息并转换为系统可支持的对象;
	 *  生成对Excel和配置信息对应的对象(MAP,存储了对应信息)
	 *  并且相关的数据验证(列,单元格)信息都存在于此处;
	 */
	public List<DiamondBO> convertSheetToList(Sheet sheet){
		List<DiamondBO> list = new ArrayList<DiamondBO>();
		try {
			Cell[] headerRow = sheet.getRow(0);// 标题栏;
			int cls=sheet.getColumns();
			int rws=sheet.getRows();
			for(int j=2;j<rws;j++){
				DiamondBO diamondBo = new DiamondBO();
				for(int i=0;i<cls;i++){
//					System.out.println(sheet.getCell(i, 0).getContents());
//					System.out.println(sheet.getCell(i, j).getContents());
					if ((sheet.getCell(i, 0).getContents()).equals("Batch")) {
						diamondBo.setBatch(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Report No")) {
						diamondBo.setReportNo(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Lab")) {
						diamondBo.setLab(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Weight")) {
						diamondBo.setWeight(Double.valueOf(sheet.getCell(i, j).getContents()));
					} else if ((sheet.getCell(i, 0).getContents()).equals("Color")) {
						diamondBo.setColor(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Clarity")) {
						diamondBo.setClarity(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Price")) {
						diamondBo.setSupPrice(Double.valueOf(sheet.getCell(i, j).getContents()));
					} else if ((sheet.getCell(i, 0).getContents()).equals("Final Cut")) {
						diamondBo.setFinalCut(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Polish")) {
						diamondBo.setPolish(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Symmetry")) {
						diamondBo.setSymmetry(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("H@A")) {
						diamondBo.setHR(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Fluor")) {
						diamondBo.setFluor(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("Shape")) {
						diamondBo.setShape(sheet.getCell(i, j).getContents());
					} else if ((sheet.getCell(i, 0).getContents()).equals("SupplierName")) {
						diamondBo.setSupplierName(sheet.getCell(i, j).getContents());
					} 
				}
				list.add(diamondBo);
			}
		} catch (Exception e) {
			log.error("配置文件出错",e);
		}
		return list;
	}



//	/**将Excel中读入的数据转换为实例对象;
//	 * 并且相关的数据验证(行)信息
//	 * @param beanMap 为<method>com.kogc.common.excel.core.ExcelUtils3#convertSheetToMap</method>转化的数据集合;
//	 * @return
//	 */
//	public   Map<String,Object> convertToObject(Map<String,CellContainer> beanMap) {
//		Map<String,Object> objMap =new HashMap<String,Object>();
//		
//		Set<String> ks=beanMap.keySet();
//		for(String k:ks){
//			CellContainer cc=beanMap.get(k);
//			Object bean=invokeObject(cc.getTargetClass(),cc,objMap,ledger);
//			//实例验证;
//			objMap.put(k, bean);
//		}
//		return objMap;
//	}
//	
//	/**直接将Excell中的工作区转换为对象(Sheet);
//	 * @param sheet
//	 * @return
//	 */
//	public Map<String,Object> convertToObject(Sheet sheet){
//		return this.convertToObject(this.convertSheetToMap(sheet));
//	}
//	
//	/**获得头信息 */
//	private int getIndexByHeader(Cell[] headerRow, String header) {
//		if(header==null) return -1;
//		for (int i = 0; i < headerRow.length; i++) {
//			if(headerRow[i]==null) continue;
//			if (header.equals(headerRow[i].getContents())) {
//				return i;
//			}
//		}
//		return -1;
//	}
//	
//	/**返回的是一个代理对象,实现对象的延迟加载;
//	 * @param clazz 
//	 * @param fieldsMap 
//	 * @param objMap 实例对象池
//	 * @return
//	 */
//	public Object invokeObject(Class<? extends Serializable> clazz,final CellContainer fieldsMap,final Map<String,Object> objMap,Ledger ledger) {
//		if(clazz==null||fieldsMap==null){return null;}
//		Object obj=null;
//		try {
//			obj = clazz.newInstance();
//		} catch (InstantiationException e) {
//			ledger.record("实例化对象出错,请检测类:"+clazz.getName()+";详细信息:"+e.getMessage(), MsgType.sys_err);
//			e.printStackTrace();
//			return null;
//		} catch (IllegalAccessException e) {
//			ledger.record("实例化对象出错,请检测类:"+clazz.getName()+";详细信息:"+e.getMessage(), MsgType.sys_err);
//			e.printStackTrace();
//			return null;
//		}
////		ExcelUtilsHelp handler =  new ExcelUtilsHelp(fieldsMap, objMap,obj);
////	    Object proxy=handler.getInstrumentedClass();
//	    
//		Set<String> fs=fieldsMap.keySet();
//		for(String f:fs){
//			Cell cell=fieldsMap.get(f);
//			invokeField(obj, f, cell,ledger);
//		}
//		return obj;
//
//	}
//	
//	/**将值绑定到对象实例中; */
//	public void invokeField(Object obj, String field, Cell cell,Ledger ledger){
//		Object value = cell.getContents();
//		try {
//			java.lang.reflect.Field f = getField(obj.getClass(), field);
//			Class<?> type = f.getType();
//			
//			if (type == int.class||type == Integer.class) {
//				value = Integer.parseInt(String.valueOf(value));
//			}
//			else if (type == float.class|| type == Float.class || type == double.class||type==Double.class) {
//				value=Double.parseDouble(value.toString());
//			}
//			else if(type==boolean.class||type==Boolean.class){
//				value=Boolean.parseBoolean((String) value);
//			}
//			else if (type == Date.class) {
//				DateCell c = (DateCell) cell;
//				value = c.getDate();
//			} 
//			else{//其它引用对象;
//				CellType ct= cell.getType();
//				if(ct==CellType.DATE){
//					type=Date.class;
//					value=((DateCell)cell).getDate();
//				}else  if(type==String.class){
//					value=cell.getContents();
//				}
//			}
//			String md_name="set"+field.substring(0,1).toUpperCase()+field.substring(1);
//			Method md=getMethod(obj.getClass(),md_name,type);
//			if(md!=null){
//				md.invoke(obj, value);
//			}
//		} catch (NoSuchFieldException e) {
//			ledger.record("配置信息出错:" + obj.getClass() + "没有属性:" + field,MsgType.sys_err);
//			e.printStackTrace();
//		}catch (Exception e) {
//			ledger.record(cell.getColumn()+1,cell.getRow()+1,null,"值‘" + value+"’注入对象："+obj.getClass() + "，属性:" + field+"时出错.详细信息:"+e.getMessage(),MsgType.sys_err);
//			e.printStackTrace();
//		}
//	}
//
//	private java.lang.reflect.Field getField(Class<?> clazz, String field)
//			throws NoSuchFieldException {
//		java.lang.reflect.Field f;
//		try{
//			f = clazz.getField(field);
//		}catch (NoSuchFieldException e){
//			try{
//				f=clazz.getDeclaredField(field);
//			}catch(NoSuchFieldException ne){
//				if(clazz.getSuperclass()!=null){
//					f=getField(clazz.getSuperclass(),field);
//				}else{
//					throw ne;
//				}
//			}
//		}
//		return f;
//	}
//	
//	private Method getMethod(Class<?> clazz, String method,Class<?> type)
//			throws NoSuchMethodException {
//		Method md;
//		try{
//			md = clazz.getMethod(method,type);
//		}catch (NoSuchMethodException e){
//			try{
//			md =clazz.getDeclaredMethod(method,type);
//			}catch (NoSuchMethodException ne){
//				if(clazz.getSuperclass()!=null){
//					md=getMethod(clazz.getSuperclass(),method,type);
//				}else{
//					throw ne;
//				}
//			}
//		}
//		return md;
//	}
//	/**得到一个对象的所有属性;
//	 * @param obj
//	 * @return
//	 */
//	private List<Field> getAllField(Class<?> obj){
//		if(obj==null){throw new NullPointerException("空指针异常");};
//		List<Field> feilds=new ArrayList<Field>();
//		
//		for(Field f:obj.getDeclaredFields()){
//			feilds.add(f);
//		}
//		for(Field f:obj.getFields()){
//			feilds.add(f);
//		}
//		if(obj.getSuperclass()!=null){
//			for(Field f:this.getAllField(obj.getSuperclass())){
//				feilds.add(f);
//			}
//		}
//		return feilds;
//	}
}
